-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "rt_zs"
VERSION = "1.0.0"

-- RT_ZS噪声传感器测试任务
-- 初始化传感器并定时读取噪声值

-- sys库是标配
sys = require("sys")
local rt_zs = require "rt_zs"

-- 接线说明
-- RT_ZS噪声传感器 --- 模块
-- TX     -   模块RX
-- RX     -   模块TX
-- VCC    -   VDDIO (3.3V或5V，根据传感器规格)
-- GND    -   GND

-- 配置参数
local UART_ID = 1  -- 串口ID
local BAUDRATE = 4800  -- 波特率
local READ_INTERVAL = 2000  -- 读取间隔(毫秒)
local INIT_RETRY_COUNT = 3  -- 初始化重试次数
local NOISE_READ_MAX_ERRORS = 5  -- 连续读取失败最大次数

-- 创建一个任务
sys.taskInit(function()
    log.info("rt_zs_task", "RT_ZS噪声传感器测试任务启动")
    
    local init_success = false
    
    -- 尝试多次初始化传感器
    for init_attempt = 1, INIT_RETRY_COUNT do
        log.info("rt_zs_task", "初始化RT_ZS传感器 (第"..init_attempt.."次尝试)")
        local ret = rt_zs.init(UART_ID, BAUDRATE)
        if ret then
            init_success = true
            log.info("rt_zs_task", "传感器初始化成功")
            break
        else
            log.error("rt_zs_task", "传感器初始化失败，等待重试...")
            sys.wait(1000)  -- 等待1秒后重试
        end
    end
    
    if not init_success then
        log.error("rt_zs_task", "经过"..INIT_RETRY_COUNT.."次尝试后，传感器初始化仍然失败")
        return
    end
    
    log.info("rt_zs_task", "开始读取噪声数据，间隔" .. tostring(READ_INTERVAL) .. "ms")
    
    -- 噪声等级描述
    local noise_levels = {
        {min = 0, max = 40, desc = "环境安静"},
        {min = 40, max = 70, desc = "环境一般"},
        {min = 70, max = 90, desc = "环境嘈杂"},
        {min = 90, max = 150, desc = "环境很吵"}
    }
    
    local consecutive_errors = 0  -- 连续错误计数
    
    -- 循环读取噪声值
    while true do
        local noise_value = rt_zs.read_noise()
        
        if noise_value then
            consecutive_errors = 0  -- 重置错误计数
            
            local noise_str = string.format("%.1f", noise_value)
            log.info("rt_zs_task", "噪声值: " .. noise_str .. "dB")
            
            -- 根据噪声值判断环境
            for _, level in ipairs(noise_levels) do
                if noise_value >= level.min and noise_value < level.max then
                    log.info("rt_zs_task", level.desc)
                    break
                end
            end
        else
            consecutive_errors = consecutive_errors + 1
            log.error("rt_zs_task", "读取噪声数据失败 (连续失败"..consecutive_errors.."次)")
            
            -- 如果连续失败次数过多，尝试重新初始化传感器
            if consecutive_errors >= NOISE_READ_MAX_ERRORS then
                log.warn("rt_zs_task", "连续读取失败次数过多，尝试重新初始化传感器...")
                rt_zs.init(UART_ID, BAUDRATE)
                consecutive_errors = 0  -- 重置错误计数
            end
        end
        
        -- 每2秒读取一次
        log.info("rt_zs_task", "等待下一次读取... ("..READ_INTERVAL.."ms)")
        sys.wait(READ_INTERVAL)
    end
end)

-- 必须加这一行
-- 启动系统任务调度
sys.run()